# This Python f use the following encoding: utf-8
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--file', help='il nome del file immagine da analizzare nel formato "<path assoluto>/<nome>.<estensione>"', required=True)
parser.add_argument('--x1', help='coordinata X dell\'angolo in alto a sinistra', required=True)
parser.add_argument('--y1', help='coordinata Y dell\'angolo in alto a sinistra', required=True)
parser.add_argument('--x2', help='coordinata X dell\'angolo in basso a destra', required=True)
parser.add_argument('--y2', help='coordinata Y dell\'angolo in basso a destra', required=True)
args = parser.parse_args()

import RAUtility as rau
from scipy.fftpack import dct, idct
from skimage.color import rgb2lab,lab2rgb
from scipy.ndimage import filters
from sklearn import svm

'''
START
'''
if __name__ == "__main__":
	step = rau.caricaProvino(args.file) #values in [0,1]

	#ritaglio il provino dallo step con le coordinate x1,x2,y1,y2
	x1 = int(args.x1) #48
	y1 = int(args.y1) #424
	x2 = int(args.x2) #388
	y2 = int(args.y2) #558
	img = step[y1:y2+1,x1:x2+1,:]


	#ritaglio il quadrato più grande che posso (lato = lato corto)
	if(img.shape[0] < img.shape[1]):
		lato  = img.shape[0]
	else:
		lato  = img.shape[1]

	#faccio un taglio 126x126
	cut = rau.cutRGB(img, fromY=0, toY=lato, fromX=0, toX=lato)
	cut_original = cut.copy()
	
	#RGB -> L*a*b*
	lab = rgb2lab(cut)

	#prendo la componente b*
	b = lab[:,:,2]

	#applico la DCT2
	b_dct2 = dct(b,axis=0,norm='ortho')
	b_dct2 = dct(b_dct2,axis=1,norm='ortho')

	#applico il filtro
	sigma = lato*0.04
	filtered = filters.gaussian_filter(b_dct2,sigma)

	#applico la iDTC2
	b_idct2 = idct(filtered,axis=1,norm='ortho')
	b_idct2 = idct(b_idct2,axis=0,norm='ortho')

	#riscostruisco l'immagine L*a*b*
	lab_after = lab.copy()
	lab_after[:,:,2] = b_idct2

	#L*a*b* -> RGB
	rgb = lab2rgb(lab_after)

	#calcolo la similarità tra la prima immagine e la nuova
	similarity = rau.distanzaRGB(cut,rgb)

	if similarity == 1.0:
		print '0.00;P'
	else:
		#print 'l\'immagine è difettosa'
		#estraggo i pixel di training
		training = rau.estraiTraining(cut,rgb)
		dataset = rau.imageToDataset(img)

		'''
		per il momento tratto tutti i pixel difettosi come se fossero ruggine
		'''

		'''
		addestro una salvaImmagine
		'''
		X = training[:,2:5]
		Y = training[:,5]
		
		C = 1.0
		svc = svm.SVC(C=1.0, cache_size=147, class_weight=None, coef0=0.5, degree=3, gamma=0.5, kernel='poly',
			probability=False, shrinking=True, tol=0.001, verbose=False).fit(X, Y)

		dataset_input = dataset[:,2:5]
		
		prediction = svc.predict(dataset_input)
		
		dataset[:,5] = prediction
		
		greenized = rau.datasetToRGB(dataset,img)

		white_rust = rau.datasetToWhiteRust(dataset,img)
		numeroMacchie = rau.contaMacchie(white_rust)
		percentualeRuggine = rau.contaRuggine(dataset[:,5])
		#print str(round(percentualeRuggine,4)*100)+';'+str(numeroMacchie)
		print str(round(percentualeRuggine,4)*100)+';P'


		#scrivo CSV
		#rau.trainingToCsv(cut_original,training)
		#rau.imgToCSV(img)


		#rau.salvaImmagine(img, '/home/davide/Dropbox/workspaces/R_RustAnalyzer/RA04/provinoSelezionato.png')
		#rau.salvaImmagine(cut_original, '/home/davide/Dropbox/workspaces/R_RustAnalyzer/RA04/before_'+str(lato)+'x'+str(lato)+'.png')
		#rau.salvaImmagine(rgb, '/home/davide/Dropbox/workspaces/R_RustAnalyzer/RA04/after_'+str(lato)+'x'+str(lato)+'.png')